package cn.itcast.spark.sql

import org.apache.spark.sql
import org.apache.spark.sql.{ColumnName, SparkSession}
import org.junit.Test

import javax.jdo.spi.JDOPermission

class Column {

  val spark = SparkSession.builder()
    .master("local[6]")
    .appName("column")
    .getOrCreate()

  import spark.implicits._

  @Test
  def creation(): Unit = {

    val ds = Seq(Person("zhangsan", 15), Person("lisi", 10)).toDS()
    val ds1 = Seq(Person("zhangsan", 15), Person("lisi", 10)).toDS()
    val df = Seq(("zhangsan", 15), ("lisi", 10)).toDF("name", "age")

    // ' 必须导入spark的隐式转换
    val column: Symbol = 'name

    // $  必须导入spark的隐式转换
    val column1: ColumnName = $"name"

    // col 必须导入functions
    import org.apache.spark.sql.functions._

    val column2: sql.Column = col("name")

    // column  必须导入functions
    val column3: sql.Column = column("name")

    // ds与ds均可以使用column对象来选中某列
    ds.select(column).show()
    df.select(column).show()

    //  select方法可以使用column，其他算子也可以
    df.where(column === "zhangsan").show()

    // column对象可以用作于DS和DF
    // column可以和命令式的弱类型的API配合使用 select where

    // dataset.col
    // 使用dataset来获取column对象，会和某个dataset进行绑定，在逻辑计划中，会有不同的表现
    val column4 = ds.col("name")
    val column5 = ds1.col("name")

    ds.select(column5).show()     // 会出错

    // 为什么要和dataset进行绑定？
    ds.join(ds1, column4 === column5)

    // dataset.apply
    val column6 = ds.apply("name")  // ds.apply()等效于ds()
    val column7 = ds("name")
  }

  @Test
  def as(): Unit = {
    val ds = Seq(Person("zhangsan", 15), Person("lisi", 10)).toDS()

    ds.select('name as "new_name").show()

    ds.select('age.as[Long]).show()
  }

  @Test
  def api(): Unit = {
    val ds = Seq(Person("zhangsan", 15), Person("lisi", 10)).toDS()

    // 1. ds增加列
    ds.withColumn("doubled", 'age * 2)

    // 2. 模糊查询
    ds.where('name like "zhang%").show()

    // 3. 排序
    ds.sort('age asc).show()

    // 4. 枚举判断
    ds.where('name isin ("zhangsan", "wangwu", "zhaoliu")).show()

  }

}
















































